function openMenu(proto,options,x,y){
    var coverE = $("<div style='position:absolute;top:0;bottom:0;left:0;right:0;z-index:99;'></div>").appendTo($("body"));
    var e = openContextMenu(proto,options,x,y,function(){
        coverE.click();
    });
    coverE.click(function(){
        if(e){
            $(this).unbind();
            $(this).remove();
            e.remove();
        }
    });
}

/**
 * 打开一个z-index为99的菜单
 *
 * options选项(可以是单个对象也可以是一个数组)：
 * name:菜单名称
 * event:点击事件，返回false则不关闭菜单
 * ico:图标url
 * css:指定渲染此选项的样式
 * clazz:指定渲染此选项的类样式
 * split:指定此选项于上一级选项分离(添加分割线)
 * disable:禁用此选项
 * child:添加子选项，子选项的参数于options一致。
 *
 * @param proto 菜单的点击事件绑定在该指定的对象上执行
 * @param options 可选项
 * @param x 菜单x轴位置
 * @param y 菜单y轴位置
 * @param close 菜单关闭时事件，返回false则不关闭
 *
 * @param context 菜单上下文，该参数用户不应该指定
 * @param index 菜单级别，该参数用户不应该指定
 * @returns {*} 返回菜单上下文：{level:element}，level是唯一的，level指定了当前显示的层次级别，element为元素
 */


function openContextMenu(proto,options,x,y,close,context,index){
    if(!options){
        return;
    }
    x = parseInt(x)||0;
    y = parseInt(y)||0;
    if(options.constructor.toString().indexOf('Array') == -1){
        var o = [options];
        options = o;
    }

    var content = $('<div class="s_right-menu-content"></div>').appendTo($("body"));
    var ul = $("<ul></ul>").appendTo(content);
    var subContent;

    if(!context){
        index=0;
        context={_tools:{}};
        context.remove = function(index,down){
            if(index && !isNaN(index)){
               if(down === true){
                   for(var i in context){
                       if(i >= index){
                           context[i].remove();
                           delete context[i];
                       }
                   }
               }else{
                   if(context[index]){
                       context[index].remove();
                       delete context[index];
                   }
               }
            }else{
                for(var i in context){
                    if(!isNaN(i)){
                        context[i].remove();
                        delete context[i];
                    }
                }
            }
        }
    }
    context[index]=content;
    var selectLi;
    $.each(options,function(i,v){
        var li = $("<li></li>").appendTo(ul);
        var span = $("<span></span>").appendTo(li);
        var a = $("<a></a>").appendTo(li);
        if(v.ico){
            span.css('background-image','url('+v.ico+')');
        }
        if(v.split === true){
            li.addClass("s_liSplit");
        }
        //是否有下级子菜单
        if(v.child){
            var be = $("<b></b>").appendTo(li);
            content.removeClass("s_liChild");
            content.addClass("s_liChild");
        }
        if(v.css){
            var cssArr=v.css;
            if(v.css.constructor.toString().indexOf("Array") === -1){
                cssArr=[];
                cssArr.push(v.css);
            }
            for(var sin in v.css){
                var s = v.css[sin];
                var sIndex = s.indexOf(":");
                li.css(s.substring(0,sIndex),s.substring(sIndex+1));
            }
        }
        if(v.clazz){
            if(v.clazz){
                var claArr=v.clazz;
                if(claArr.constructor.indexOf("Array") == -1){
                    claArr=[];
                    claArr.push(v.clazz);
                }
                for(var sin in claArr){
                    li.addClass(claArr[sin]);
                }
            }
        }
        a.text(v.name||'');
        if(v.disable){
            li.addClass("s_liDisable");
            return;
        }

        //点击事件
        if(typeof(v.event) === 'function'){
            li.click(function(e){
                var isClose = v.event.call(proto);
                e.stopPropagation(e);
                if(isClose === false){
                    return;
                }
                if(close && close() === false){
                    return;
                }
                context.remove();
            })
        }else{
            li.click(function(e){
                e.stopPropagation();
                if(close && close() === false){
                    return;
                }
                context.remove();
            })
        }

        li.mouseenter(function(){
            if(selectLi){
                selectLi.removeClass("s_liSelect");
                s_liSelect = undefined;
            }
            if(subContent){
                context.remove(index+1,true);
                subContent=undefined;
            }
            if(v.child) {
                subContent = openContextMenu(proto,v.child,li.offset().left+li.outerWidth()-2,li.offset().top,close,context,index+1)[index+1];
                li.addClass("s_liSelect");
                selectLi = $(this);
            }
        });
        li.mouseleave(function(e){
            if(subContent){
                /*if(e.pageX<content.offset().left||e.pageY<content.offset().top
                    ||e.pageX>content.offset().left+content.outerWidth()||e.pageY>content.offset().top+content.outerHeight()){
                    return;
                }*/
                if(e.pageX<subContent.offset().left||e.pageY<subContent.offset().top
                    ||e.pageX>subContent.offset().left+subContent.outerWidth()||e.pageY>subContent.offset().top+subContent.outerHeight()){
                    subContent.remove();
                    delete context[index+1];
                    subContent=undefined;
                    li.removeClass("s_liSelect");
                }
            }
        });

    });
    if(content.outerWidth()+x>window.innerWidth){
        x = window.innerWidth - content.outerWidth() - 2;
        var parent = context[index-1];
        if(parent){
            if(x < parent.offset().left + parent.outerWidth() - 2){
                x = parent.offset().left - content.outerWidth()+2;
            }
        }
        if(x<0){
            x=0;
        }
    }
    if(content.outerHeight()+y>window.innerHeight){
        y = window.innerHeight - content.outerHeight();
    }
    content.css('left',x+"px");
    content.css('top',y+"px");

    return context;
}

/**
 * 为某一元素绑定右键菜单，基于jQuery实现
 * sBindContextMenu:为指定的元素绑定右键菜单，options参考上述文档 event事件的运行上下文环境为当前被选中的原生dom对象
 * sUnbindContextMenu:解绑右键菜单
 * updateOptions:更新右键菜单(全更新) options参考上述文档 event事件的运行上下文环境为当前被选中的原生dom对象
 */
$.extend($.fn,{
    sBindContextMenu:function(options){
        this.updateOptions(options);
        $(this).each(function(){
            var self = this;
            $(this).bind("contextmenu",self._eb=function(e){
                if(self._e){
                    self._e.remove();
                }
                self._coverE = $("<div style='position:absolute;top:0;bottom:0;left:0;right:0;z-index:99;'></div>").appendTo($("body"));
                self._e = openContextMenu(self,self._options,e.pageX,e.pageY,function(){
                    self._coverE.click();
                });
                self._coverE.click(function(){
                    if(self._e){
                        $(this).unbind();
                        $(this).remove();
                        self._e.remove();
                        delete self._e;
                    }
                });
                e.preventDefault();
            });
        });
    },
    sUnbindContextMenu:function(){
        $(this).each(function(){
            var self = this;
            if(self._eb) $(this).unbind("contextmenu",self._eb);
        });
    },
    updateOptions:function(options){
        $(this).each(function() {
            var self = this;
            self._options=options;
        });
    }
});